#include<bits/stdc++.h>

using namespace std;
int n,Q;
struct data{
	int val;
	int id;
}a[400005];
bool cmp(data A,data B){
	if(A.val!=B.val)return A.val<B.val;
	return A.id<=B.id; 
}
struct tree{
	int lson,rson;
	data val;
	int fix;
	int siz;
}t[400005];
int root;
int g;
void update(int rt){
	t[rt].siz=t[t[rt].lson].siz+t[t[rt].rson].siz+1;
}
void split(int rt,int &x,int &y,data v){
	if(!rt){
		x=y=0;
		return;
	}
	
	if(cmp(t[rt].val,v)){
		x=rt;
		split(t[rt].rson,t[x].rson,y,v);
		update(x);
	}
	else {
		y=rt;
		split(t[rt].lson,x,t[y].lson,v);
		update(y);
	}
}
void merge(int &rt,int x,int y){
	if(!x||!y){
		rt=x+y;
		return;
	}
	if(t[x].fix<=t[y].fix){
		rt=x;
		merge(t[rt].rson,t[x].rson,y);
		update(rt);
	}
	else {
		rt=y;
		merge(t[rt].lson,x,t[y].lson);
		update(rt);
	}
}
int Newnode(data V){
	t[++g].fix=1ll*rand()*rand();
	t[g].lson=t[g].rson=0;
	t[g].siz=1;
	t[g].val=V;
	return g; 
}
void Insert(data V){
	int x,y,z;
	x=y=z=0;
	split(root,x,y,V);
	merge(x,x,Newnode(V)); 
	merge(root,x,y);
}
void Del(data V){
	int x,y,z;
	x=y=z=0;
	split(root,x,y,V);
	V.id--;
	split(x,x,z,V);
	merge(root,x,y);
}
int Find(int rt,data v){
	
	if(!rt)return 0;
	if(cmp(t[rt].val,v))return t[t[rt].lson].siz+1+Find(t[rt].rson,v);
	return Find(t[rt].lson,v);
}
int main(){
	freopen("sort.in","r",stdin);
	freopen("sort.out","w",stdout);
	srand(998244353);
	scanf("%d%d",&n,&Q);
	for(int i=1;i<=n;i++)scanf("%d",&a[i].val),a[i].id=i,Insert(a[i]);
	for(int i=1;i<=Q;i++){
		int opt;
		scanf("%d",&opt);
		if(opt==1){
			int x,v;
			scanf("%d%d",&x,&v);
			Del(a[x]);
			a[x].val=v;
			Insert(a[x]);
		}
		else {
			int x;
			scanf("%d",&x);
			printf("%d\n",Find(root,a[x]));
		}
	}
	return 0;
}
